<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title></title>
	</head>
	<body>
		
	</body>
	<script>
		//函数声明：函数调用，参数，返回值
		//函数表达式：将函数赋值给一个变量，用变量名进行调用
		//匿名函数：没有函数名字
		//立即执行函数：匿名函数自调用
		//回调函数：把函数当作另一个函数的参数传入，在另一个函数中调用
		//递归函数：在函数中调用自己。递归执行时容易造成死循环，慎用！
		//把函数当作返回值  >闭包
		let fn1=function(a,b){
			return a+b;
		};
		let fn2=function(f){return f;};
		console.log(fn2(fn1(1,2)));
		
		//作用域：变量作用的范围
		//js代码运行的两个阶段：
		/*
		1.解析（编译）：语法检查、声明变量和函数
		2.运行：变量赋值、按照执行的流程执行代码。
		var和let的区别
		1.var可以重复声明变量，let不允许。
		2.var：允许变量声明提升
		let:暂时性死区
		(var允许先访问后声明，而let访问前必须声明变量)
		3.var和let都有全局作用域、局部作用域、对于let多了一个块{}作用域
		let 和const比var使用更严谨，推荐使用
		
		*/
	   /*作用域链
	   //执行上下文：js代码执行的环境
	   
	   
	   
	   
	   */
	  //2.
	   var x=10;
	   console.log(x);
	   var x='hello';
	   console.log(x);
	   let a=10;
	   console.log(a);
	   let c='hello';
	   console.log(c);
	   console.log('---------------');
	   console.log(t1);
	   let t2;
	   console.log(t2);
	   var t1=123;
		console.log('---------------');
		//3.
		let num1=10;var num2=20;//全局变量
		function fun(){
			let f1='hello';//局部变量：函数作用域中声明的变量
			let f2='js';//局部变量
			console.log(num1);
			console.log(num2);
			console.log(f1);
			console.log(f2);
		}
		fun();
		console.log('---------------');
		console.log(num1);
		console.log(num2);
		//console.log(f2);//局部变量在超出作用域范围后不能访问，会报错
		//console.log(f1);//局部变量在超出作用域范围后不能访问，会报错
		console.log('---------------');
		//块作用域
		for(let i=0;i<3;i++){
			console.log('let:'+i);
		}
		//console.log(i);//无法访问块作用域外的变量
		console.log('---------------');
		for(var j=0;j<3;j++){
			console.log('var:'+j);
		}
		console.log(j);//在这里的j相当于全局变量
		console.log('-------作用域链--------');
		let name='tom';
		function fn3(){
			let age=10;
			function fn4(){
				let sex='男';
				console.log(name);
				console.log(age);
				console.log(sex);
				
			}fn4();
			
		}fn3();
		//上下文栈。栈（后进先出）
		/*全局上下文:fn3(),name
		函数上下文:fn4(),age
		函数上下文:sex
		*/
		
		
		
	</script>
</html>
